#ifndef XMLINFOMONSTRE_HPP
#define XMLINFOMONSTRE_HPP

#include "XmlInfoCaracteristiques.hpp"

#include <QtCore/QList>

/**
 * Classe représentant un monstre. En plus des traits hérités de la
 * classe mère, un monstre est défini par ses score de contrôle,
 * endurance, combat, sa prime, ...
 *
 * @author Johan "Solo" Luisier
 * @date Octobre 2011
 */
class XmlInfoMonstre : public XmlInfoCaracteristiques
{
public:
    /** Constructeur standard.
     * Initialise la classe mère et les attributs spécifiques à l'objet.
     *
     * @param[in] nomFichier nom du fichier XML lu.
     * @param[in] id numéro d'identification de l'objet.
     * @param[in] nom nom de l'objet.
     * @param[in] sadisme valeur du score de sadisme.
     * @param[in] laideur valeur du score de laideur.
     * @param[in] force valeur du score de force.
     * @param[in] gourmandise valeur du score de gourmandise.
     * @param[in] controle valeur du score de contrôle.
     * @param[in] combat valeur du score de combat.
     * @param[in] endurance valeur du score d'endurance.
     * @param[in] prime valeur de la prime.
     */
    XmlInfoMonstre( const QString& nomFichier,
                    const unsigned& id,
                    const QString& nom,
                    const unsigned& sadisme = 0,
                    const unsigned& laideur = 0,
                    const unsigned& force = 0,
                    const unsigned& gourmandise = 0,
                    const unsigned& controle = 0,
                    const unsigned& combat = 0,
                    const unsigned& endurance = 0,
                    const unsigned& prime = 0 );
    /** Constructeur de copie.
     * Permet de dupliquer une instance de @c %XmlInfoMonstre.
     *
     * @param[in] monstre instance de %XmlInfoMonstre à copier.
     */
    XmlInfoMonstre( const XmlInfoMonstre& monstre );
    /** Destructeur.
     * Le destructeur n'a rien de particuler à faire.
     */
    virtual ~XmlInfoMonstre();
    /** Opérateur d'affectation.
      * Permet de copier le contenu d'une instance de \c %XmlInfoMonstre dans
      * l'instance courante.
      *
      * @param[in] monstre instance de %XmlInfoMonstre à copier.
      *
      * @return une référence sur l'instance courante.
      */
    XmlInfoMonstre& operator=( const XmlInfoMonstre& monstre );
    /** Méthode permettant de créer une instance depuis une balise XML.
      * Une balise permet de définir une instance à partir de ses attributs :
      * chaque attribut correspond à un membre de la classe.
      *
      * @param[in] nomFichier nom du fichier XML.
      * @param[in] infos liste des valeurs utilisées, indexée par le nom de
      * l'attribut.
      *
      * @return une instance de @c XmlInfoMonstre qui est vide si une erreur
      * se produit lors de la lecture des informations.
      *
      * @todo changer le traitement des infos récupérées et récupérables... avec
      * deux listes c'est pas top, en plus il faut bosser avec des indices
      * numériques et c'est pas très propre.
      */
    static XmlInfoMonstre creeInstance( const QString &nomFichier,
                                        const QHash<QString, QString> *infos );
    /** Permet d'afficher les informations contenues dans un flot de
     * sortie.
     * Est utilisé lors de la phase de debug.
     */
    void afficheInstance() const;
    /** Permet d'accéder au score voulu, pouvant être utilisé dans une boucle.
      *
      * @param[in] car EnumCaracteristique de la compétence voulue.
      *
      * @return une référence constante sur le "trait" voulu.
      */
    const unsigned& caracteristique( const EnumCaracteristique& car ) const;
    /** Permet d'accéder au score voulu, pouvant être utilisé dans une
     * boucle. Cette fois l'argument est de type @c unsigned.
     * Pour s'assurer que la caractéristique voulue a bien un index entre 0 et 4
     * le modulo 5 est pris.
     *
     * @param[in] car "numéro" de la compétence voulue, converti en
     * EnumCaracteristique.
     *
     * @return une référence constante sur le "trait" voulu.
     */
    const unsigned& caracteristique( const unsigned& car ) const;
    /** Permet d'accéder à la caractéristique voulue.
      *
      * @param[in] car caractéristique voulue.
      *
      * @return une référence sur la valeur désirée.
      */
    unsigned& rCaracteristique( const EnumCaracteristique& car );
    /** Permet d'accéder à la caractéristique voulue.
      * Cette fois l'argument est un nombre entier.
      *
      * @param[in] car caractéristique voulue.
      *
      * @return une référence sur la valeur désirée.
      */
    unsigned& rCaracteristique( const unsigned& car );
    /** Permet d'accéder à Controle.
      *
      * @return une référence constante sur Controle.
      */
    const unsigned& controle() const;
    /** Permet d'accéder à Combat.
      *
      * @return une référence constante sur Combat.
      */
    const unsigned& combat() const;
    /** Permet d'accéder à Endurance.
      *
      * @return une référence constante sur Endurance.
      */
    const unsigned& endurance() const;
    /** Permet d'accéder à Prime.
      *
      * @return une référence constante sur Prime.
      */
    const unsigned& prime() const;
    /** Permet d'accéder à NbrSucces.
      *
      * @return une référence constante sur .
      */
    const unsigned& nbrSucces() const;
    /** Permet d'accéder à NbrEchecs.
      *
      * @return une référence constante sur NbrEchecs.
      */
    const unsigned& nbrEchecs() const;
    /** Permet d'accéder à NbrDevores.
      *
      * @return une référence constante sur NbrDevores.
      */
    const unsigned& nbrDevores() const;
    /** Permet d'accéder à PrixRevent.
      *
      * @return une référence constante sur PrixRevente.
      */
    const unsigned& prixRevente() const;
    /** Permet d'accéder à NiveauEntrainement.
      *
      * @return une référence constante sur NiveauEntrainement.
      */
    const unsigned& niveauEntrainement() const;
    /** Permet d'accéder à NiveauFusion.
      *
      * @return une référence constante sur NiveauFusion.
      */
    const unsigned& niveauFusion() const;
    /** Permet d'accéder à SpecialisteMbl.
      *
      * @return une référence constante sur SpecialisteMbl.
      */
    const bool& specialisteMbl() const;
    /** Permet d'accéder à UrlAffichage.
      *
      * @return une référence constante sur UrlAffichage.
      */
    const QString& urlAffichage() const;
    /** Permet d'accéder à NbrHeuresRepos.
      *
      * @return une référence constante sur NbrHeuresRepos.
      */
    const unsigned& nbrHeuresRepos() const;
    /** Permet d'accéder à IdContratEffectue.
      *
      * @return une référence constante sur IdContratEffectue.
      */
    const unsigned& idContratEffectue() const;
    /** Permet d'accéder à IdContratEscorte.
      *
      * @return une référence constante sur IdContratEscorte.
      */
    const unsigned& idContratEscorte() const;
    /** Permet d'accéder à IdAttaque.
      *
      * @return une référence constante sur IdAttaque.
      */
    const unsigned& idAttaque() const;
    /** Permet d'accéder à IdRacket.
      *
      * @return une référence constante sur IdRacket.
      */
    const unsigned& idRacket() const;
    /** Permet d'accéder à IdPropagande.
      *
      * @return une référence constante sur idPropagande.
      */
    const unsigned& idPropagande() const;
    /** Permet d'accéder à IdMatch.
      *
      * @return une référence constante sur IdMatch.
      */
    const unsigned& idMatch() const;
    /** Permet d'accéder à EquipementPermanent.
      *
      * @return un pointeur constant sur EquipementPermanent.
      */
    const QList< unsigned >* equipementPermanent() const;
    /** Permet d'accéder à EquipementTemporaire.
      *
      * @return un pointeur constant sur EquipementTemporaire.
      */
    const QList< unsigned >* equipementTemporaire() const;
    /** Permet d'accéder à NbrSpas.
      *
      * @return une référence constante sur NbrSpas.
      */
    const unsigned& nbrSpas() const;
    /** Permet de changer la valeur de Controle.
      *
      * @param[in] controle nouvelle valeur de Controle.
      */
    void setControle( const unsigned& controle );
    /** Permet de changer la valeur de Combat.
      *
      * @param[in] combat nouvelle valeur de Combat.
      */
    void setCombat( const unsigned& combat );
    /** Permet de changer la valeur de Endurance.
      *
      * @param[in] endurance nouvelle valeur de Endurance.
      */
    void setEndurance( const unsigned& endurance );
    /** Permet de changer la valeur de Prime.
      *
      * @param[in] prime nouvelle valeur de Prime.
      */
    void setPrime( const unsigned& prime );
    /** Permet de changer la valeur de NbrSucces.
      *
      * @param[in] nbrSucces nouvelle valeur de NbrSucces.
      */
    void setNbrSucces( const unsigned& nbrSucces );
    /** Permet de changer la valeur de NbrEchecs.
      *
      * @param[in] nbrEchecs nouvelle valeur de NbrEchecs.
      */
    void setNbrEchecs( const unsigned& nbrEchecs );
    /** Permet de changer la valeur de NbrDevores.
      *
      * @param[in] nbrDevores nouvelle valeur de NbrDevores.
      */
    void setNbrDevores( const unsigned& nbrDevores );
    /** Permet de changer la valeur de PrixRevente.
      *
      * @param[in] prixRevente nouvelle valeur de PrixRevente.
      */
    void setPrixRevente( const unsigned& prixRevente );
    /** Permet de changer la valeur de NivEntrainement.
      *
      * @param[in] nivEntrainement nouvelle valeur de NivEntrainement.
      */
    void setNiveauEntrainement( const unsigned& nivEntrainement );
    /** Permet de changer la valeur de NivFusion.
      *
      * @param[in] nivFusion nouvelle valeur de NivFusion.
      */
    void setNiveauFusion( const unsigned& nivFusion );
    /** Permet de changer la valeur de SpecialisteMbl.
      *
      * @param[in] specialisteMbl nouvelle valeur de SpecialisteMbl.
      */
    void setSpecialisteMbl( const bool& specialisteMbl );
    /** Permet de changer la valeur de UrlAffichage.
      *
      * @param[in] urlAffichage nouvelle valeur de UrlAffichage.
      */
    void setUrlAffichage( const QString& urlAffichage );
    /** Permet de changer la valeur de NbrHeuresRepos.
      *
      * @param[in] nbrHeuresRepos nouvelle valeur de NbrHeuresRepos.
      */
    void setNbrHeuresRepos( const unsigned& nbrHeuresRepos );
    /** Permet de changer la valeur de IdContrat.
      *
      * @param[in] idContrat nouvelle valeur de IdContrat.
      */
    void setIdContratEffectue( const unsigned& idContrat );
    /** Permet de changer la valeur de IdEscorte.
      *
      * @param[in] idEscorte nouvelle valeur de IdEscorte.
      */
    void setIdContratEscorte( const unsigned& idEscorte );
    /** Permet de changer la valeur de IdAttaque.
      *
      * @param[in] idAttaque nouvelle valeur de IdAttaque.
      */
    void setIdAttaque( const unsigned& idAttaque );
    /** Permet de changer la valeur de IdRacket.
      *
      * @param[in] idRacket nouvelle valeur de IdRacket.
      */
    void setIdRacket( const unsigned& idRacket );
    /** Permet de changer la valeur de IdPropagande.
      *
      * @param[in] idPropagande nouvelle valeur de IdPropagande.
      */
    void setIdPropagande( const unsigned& idPropagande );
    /** Permet de changer la valeur de IdMatch.
      *
      * @param[in] idMatch nouvelle valeur de IdMatch.
      */
    void setIdMatch( const unsigned& idMatch );
    /** Permet de changer la valeur de EquipementPermanent.
      *
      * @param[in] permanent nouvelle valeur de EquipementPermanent.
      */
    void setEquipementPermanent( const QList< unsigned >& permanent );
    /** Permet de changer la valeur de EquipementTemporaire.
      *
      * @param[in] temporaire nouvelle valeur de EquipementTemporaire.
      */
    void setEquipementTemporaire( const QList< unsigned >& temporaire );
    /** Permet de changer la valeur de NbrSpas.
      *
      * @param[in] nbrSpas nouvelle valeur de NbrSpas.
      */
    void setNbrSpas( const unsigned& nbrSpas );
protected:
    /** Constructeur par défaut.
      * Est utilisé pour renvoyer une instance non valide depuis creeInstance.
      */
    XmlInfoMonstre();
    /**
      * Score de contrôle du monstre, utile pour ne pas manger la victime
      * quand il ne le faut pas et pour les propagandes.
      */
    unsigned Controle;
    /**
      * Score de combat du monstre, utile pour le MBL par exemple.
      */
    unsigned Combat;
    /**
      * Score d'endurance, détermine la durée de fatigue après un contrat
      * et le nobre de points de vie pour les match de MBL.
      */
    unsigned Endurance;
    /**
      * Coût à payer pour que le monstre effectue une action quelconque.
      */
    unsigned Prime;

    /**
      * Nombre de contrats réussis.
      */
    unsigned NbrSucces;
    /**
      * Nombre de contrats ratés.
      */
    unsigned NbrEchecs;
    /**
      * Nombre de victimes mangées.
      */
    unsigned NbrDevores;
    /**
      * Prix de revente du monstre, touché s'il est licencié.
      */
    unsigned PrixRevente;

    /**
      * Niveau d'entrainement monstrueux (de 0 à 5).
      */
    unsigned NiveauEntrainement;
    /**
      * Niveau de fusion, càd le nombre de fusions effectuées pour
      * obtenir ce monstre.
      */
    unsigned NiveauFusion;
    /** Détermine si le monstre est un monstre spécialisé MBL.
      * Un tel monstre ne peut être assigné à un contrat. Il faut effectuer une
      * recherche au laboratoire pour pouvoir posséder un tel monstre.
      */
    bool SpecialisteMbl;

    /**
      * Url du gif animé pour afficher le monstre.
      */
    QString UrlAffichage;

    /**
      * Nombre d'heures dont le monstre a encore besoin pour pouvoir
      * effectuer une nouvelle action.
      */
    unsigned NbrHeuresRepos;
    /**
      * Id du contrat affecté au monstre.
      */
    unsigned IdContratEffectue;
    /**
      * Id du contrat pour lequel le monstre va escorter l'exécutant.
      */
    unsigned IdContratEscorte;
    /**
      * Id de l'attaque de portail effectuée par le monstre.
      */
    unsigned IdAttaque;
    /**
      * Id du racket effectué par le monstre.
      */
    unsigned IdRacket;
    /**
      * Id de la propagande effectuér par le monstre.
      */
    unsigned IdPropagande;
    /**
      * Id du match MBL dans lequel le monstre joue.
      */
    unsigned IdMatch;

    /**
      * Liste contenant les id des équipement permanents du monstre.
      */
    QList< unsigned > EquipementPermanent;
    /**
      * Liste contenant les id des équipement temporaires du monstre.
      */
    QList< unsigned > EquipementTemporaire;

    /**
      * Nombre de ticket spas utilisable par le monstre s'il est
      * d'astreinte sur le tas d'ordure.
      */
    unsigned NbrSpas;

};

#endif // XMLINFOMONSTRE_HPP
